// 引入内置模块：fs（文件操作）、readline（交互式输入）、path（路径处理）
const fs = require('fs').promises;
const readline = require('readline');
const path = require('path');

// 1. 创建交互式输入接口
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: '> ' // 输入提示符
});

// 2. 定义文件夹根路径（所有操作基于此目录）
const BASE_DIR = __dirname;
// 存储当前创建的文件夹名称（用于后续文件操作）
let createdDir = '';

// 3. 步骤1：创建文件夹（命令格式：mkdir 文件夹名）
async function createDir() {
  rl.question('请输入要创建的文件夹（格式：mkdir filedir）：\n', async (input) => {
    const [cmd, dirName] = input.trim().split(' ');
    // 校验命令格式
    if (cmd !== 'mkdir' || !dirName) {
      console.log('❌ 命令格式错误！请输入：mkdir 文件夹名（如 mkdir filedir）\n');
      return createDir(); // 格式错误，重新输入
    }

    const dirPath = path.resolve(BASE_DIR, dirName);
    try {
      // 创建文件夹（recursive: false 避免创建多级目录，符合实验要求）
      await fs.mkdir(dirPath, { recursive: false });
      createdDir = dirName; // 记录创建的文件夹
      console.log(`✅ 文件目录创建成功！（路径：${dirPath}）\n`);
      createFile(); // 下一步：创建文件
    } catch (err) {
      if (err.code === 'EEXIST') {
        console.log(`❌ 错误：文件夹 "${dirName}" 已存在\n`);
      } else {
        console.log(`❌ 文件夹创建失败：${err.message}\n`);
      }
      createDir(); // 失败后重新输入
    }
  });
}

// 4. 步骤2：创建文件（命令格式：touch 文件名，在步骤1的文件夹内）
async function createFile() {
  if (!createdDir) {
    console.log('❌ 请先创建文件夹！\n');
    return createDir();
  }

  rl.question(`请输入要创建的文件（格式：touch file.txt，将创建在 ${createdDir} 内）：\n`, async (input) => {
    const [cmd, fileName] = input.trim().split(' ');
    // 校验命令格式
    if (cmd !== 'touch' || !fileName) {
      console.log('❌ 命令格式错误！请输入：touch 文件名（如 touch file.txt）\n');
      return createFile();
    }

    const filePath = path.resolve(BASE_DIR, createdDir, fileName);
    const fileContent = 'hello node'; // 固定文件内容（实验要求）
    try {
      // 创建文件并写入内容
      await fs.writeFile(filePath, fileContent, 'utf8');
      console.log(`✅ 文件创建成功！（路径：${filePath}，内容：${fileContent}）\n`);
      deleteFile(); // 下一步：删除文件
    } catch (err) {
      console.log(`❌ 文件创建失败：${err.message}\n`);
      createFile(); // 失败后重新输入
    }
  });
}

// 5. 步骤3：删除文件（命令格式：delete 文件名，删除步骤2创建的文件）
async function deleteFile() {
  if (!createdDir) {
    console.log('❌ 请先创建文件夹和文件！\n');
    return createDir();
  }

  rl.question(`请输入要删除的文件（格式：delete file.txt，删除 ${createdDir} 内的文件）：\n`, async (input) => {
    const [cmd, fileName] = input.trim().split(' ');
    // 校验命令格式
    if (cmd !== 'delete' || !fileName) {
      console.log('❌ 命令格式错误！请输入：delete 文件名（如 delete file.txt）\n');
      return deleteFile();
    }

    const filePath = path.resolve(BASE_DIR, createdDir, fileName);
    try {
      // 删除文件
      await fs.unlink(filePath);
      console.log(`✅ 文件删除成功！（已删除：${filePath}）`);
      console.log('👋 程序执行完成，退出！');
      rl.close(); // 成功后退出程序
    } catch (err) {
      if (err.code === 'ENOENT') {
        console.log(`❌ 错误：文件 "${fileName}" 不存在\n`);
      } else {
        console.log(`❌ 文件删除失败：${err.message}\n`);
      }
      deleteFile(); // 失败后重新输入
    }
  });
}

// 6. 启动交互式流程（从创建文件夹开始）
console.log('🎉 欢迎使用文件管理器！请按提示执行操作：');
console.log('步骤1：创建文件夹（示例：mkdir filedir）');
console.log('步骤2：创建文件（示例：touch file.txt）');
console.log('步骤3：删除文件（示例：delete file.txt）\n');
createDir();

// 监听程序退出事件
rl.on('close', () => {
  process.exit(0);
});